package com.hitqz.robot.driver.netty.protocol.decoder;

import com.hitqz.robot.driver.netty.protocol.message.KcMessage;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.socket.DatagramPacket;
import io.netty.handler.codec.MessageToMessageDecoder;
import lombok.extern.slf4j.Slf4j;

import java.util.List;

/**
 * 机器人控制信息的解码器
 *
 * @author wengyx
 * @date 2023/8/4
 */
@Slf4j
public class KcDecoder extends MessageToMessageDecoder<DatagramPacket> {

    @Override
    protected void decode(ChannelHandlerContext channelHandlerContext, DatagramPacket packet, List<Object> list) {
        ByteBuf byteBuf = packet.content();
        try {

            // 检查授权码
            byte[] licenseValid = new byte[16];
            byteBuf.readBytes(licenseValid);


            // 读取版本号（如果需要）
            byte version = byteBuf.readByte();

            // 读取消息类型
            byte type = byteBuf.readByte();

            // 读取序列号
            short sequence = byteBuf.readShortLE();

            // 读取服务码（如果需要）
            byte serviceCode = byteBuf.readByte();

            // 读取命令码
            byte cmd = byteBuf.readByte();

            // 读取执行码
            byte executeCode = byteBuf.readByte();

            // 读取保留位1
            byte reserve1 = byteBuf.readByte();

            // 读取数据长度
            short dataLength = byteBuf.readShortLE();

            // 读取保留位2
            byte[] reserve2 = new byte[2];
            byteBuf.readBytes(reserve2);

            // 读取数据区
            byte[] data = new byte[dataLength];
            if (dataLength > 0) {
                byteBuf.readBytes(data);
            }
            // 创建并添加消息对象
            KcMessage message = new KcMessage(type, sequence, cmd, executeCode, dataLength, data);
            log.debug("[kc] decoder message:{}", message);
            list.add(message);
        } catch (Exception e) {
            log.error("[kc]robot decoder error", e);
            byteBuf.readBytes(byteBuf.readableBytes());
        }
    }



}
